package spil;
import boundaryToMatador.GUI;

public class Round {

	public Round(){
	}

	public void startRound(int n){
		
		DiceCup rafle = new DiceCup(); // Rafleb�ger oprettes

		boolean endGame = false; // true = while-loop afsluttes, der er fundet en vinder!
		Person spiller = Main.spiller1, preSpiller = null; // Vi opretter to 'pseudo-personer' og bruger disse til at styre hvis tur det er
		
		/* 
		 * Switchen bruges til at bestemme om vi skal afvikle i GUI(1) eller i TUI(2).
		 * Koden er identisk for de to cases, eneste forskel er hvorvidt metodekald går til TUI eller GUI når der skal vises noget for spilleren.
		 * Dokumentation for koden er derfor kun opdateret for case1.
		 */
		switch (n) 
		{
		case 1: // Case 1 = spillet foreg�r via GUI
		{
			while (endGame == false) // Spillet fortsættes til der er fundet en vinder
			{
				// Sætter preSpiller til den person der lige har haft sin tur.
				if (spiller == Main.spiller1) {
					preSpiller = Main.spiller2;
				}
				else {
					preSpiller = Main.spiller1;
				}
				
				GUI.showMessage(spiller.getName() + " klik \"OK\" for at slå med terningerne."); // Bed spilleren sl� med terningerne
				rafle.rollDice(); // Terningerne rulles!
				int[] value = rafle.getDice(); // Opretter et array af integers som holder værdien af terningeslaget

				GUI.setDice(value[0], value[1]); // Viser v�rdi af slaget p� GUI

				// Tjekker om spiller1 har sl�et to seksere to gange i tr�k
				if (value[0] == 6 && value[1] == 6 && spiller.getPreviousDie1() == 6 && spiller.getPreviousDie2() == 6) {
					GUI.showMessage("TILLYKKE " + spiller.getName() + ". DU HAR VUNDET SPILLET!");
					endGame = true;
				}

				else {
					spiller.setPreviousDice(value[0], value[1]); // Gem v�rdierne af terningslaget hos spiller 1
					if (preSpiller.getWinCondition() == true) { // Foruds�tter spiller2 har over 40 point OG har sl�et 2 ens i forrige runde
						if (rafle.equal() == true) {// Hvis spilleren har sl�et to ens
							// Tjekker om spiller1 har sl�et to ettere og nulstiller hans point i s� fald
							if (value[0] == 1 && value[1] == 1) {
								spiller.setPoint(0);
								spiller.setWinCondition(false);
							}
							else {
								if (spiller.getPoint() >= 40) { // Hvis spilleren har over 40 point
									spiller.setWinCondition(true);
								}

								// T�l point sammen, opdater p� GUI
								spiller.setPoint(rafle.sum() + spiller.getPoint()); // Tilf�jer summen af slaget til spillerens point
							}
							GUI.setBalance(spiller.getName(), spiller.getPoint()); // Opdaterer spillerens point p� GUI'en
						}
						else { // Hvis spiller ikke har slået to ens skal der findes en vinder, idet preSpiller.winCondition == true.
							
							// Hvis spiller.winCondition == true så skal vi sammenligne de to spilleres point.
							if (spiller.getWinCondition() == true) { 
								spiller.setPoint(rafle.sum() + spiller.getPoint());
								GUI.setBalance(spiller.getName(), spiller.getPoint());
								
								if (spiller.getPoint() > preSpiller.getPoint()) {
									GUI.showMessage("TILLYKKE " + spiller.getName() + ". DU HAR VUNDET SPILLET!");
									endGame = true;
								}
								else {
									GUI.showMessage("TILLYKKE " + preSpiller.getName() + ". DU HAR VUNDET SPILLET!");
									endGame = true;
								}
							}
							else { // her vinder preSpiller idet spiller.winCondition == false.
								GUI.showMessage("TILLYKKE " + preSpiller.getName() + ". DU HAR VUNDET SPILLET!");
							}
							endGame = true; 
						}
					}

					else {// Foruds�tter spiller2 ikke har over 40 point OG har sl�et 2 ens i forrige runde
						
						// Tjekker om spiller1 har sl�et to ettere og nulstiller hans point i s� fald
						if (value[0] == 1 && value[1] == 1) {
							spiller.setPoint(0); // Nulstil point
							spiller.setWinCondition(false);
							GUI.setBalance(spiller.getName(), spiller.getPoint()); // Opdaterer spillerens point p� GUI'en
						}
						else {
							if (rafle.equal() == true) {// To ens som ikke er to ettere
								if (spiller.getPoint() >= 40) // Ændrer winCondition når spiller har over 40 point OG har slået 2 ens. 
									spiller.setWinCondition(true);

								spiller.setPoint(rafle.sum() + spiller.getPoint()); // Tilf�jer summen af slaget til spillerens point
								GUI.setBalance(spiller.getName(), spiller.getPoint()); // Opdaterer spillerens point p� GUI'en
								spiller = preSpiller; // Hvis der er slået to ens skal spiller have en ekstra tur. Derfor skifter vi turen nu, idet vi vil skifte turen igen senere i koden.
							}
							else {// Turen skifter til spiller2
								spiller.setPoint(rafle.sum() + spiller.getPoint()); // Tilf�jer summen af slaget til spillerens point
								GUI.setBalance(spiller.getName(), spiller.getPoint()); // Opdaterer spillerens point p� GUI'en
							}
							
							// Vi ændrer spiller til den person der ikke lige har haft sin tur.
							if (spiller == Main.spiller1) { 
								spiller = Main.spiller2;
							}
							else if (spiller == Main.spiller2) {
								spiller = Main.spiller1;
							}
						}
					}
				}
			}
		}
		break;
		case 2: // Case 2 = spillet foreg�r p� TUI
		{
			while (endGame == false)
			{
				if (spiller == Main.spiller1) {
					preSpiller = Main.spiller2;
				}
				else {
					preSpiller = Main.spiller1;
				}

				// Bed spilleren sl� med terningerne
				TUI.showMessage(spiller.getName() + " klik \"OK\" for at slå med terningerne.");
				rafle.rollDice(); 
				int[] value = rafle.getDice(); // Hent v�rdierne af terningslaget

				TUI.setDice(value[0], value[1]); // Viser v�rdi af slaget p� GUI

				// Tjekker om spiller1 har sl�et to seksere to gange i tr�k
				if (value[0] == 6 && value[1] == 6 && spiller.getPreviousDie1() == 6 && spiller.getPreviousDie2() == 6) {
					TUI.showMessage("TILLYKKE " + spiller.getName() + ". DU HAR VUNDET SPILLET!");
					endGame = true;
				}

				else {
					spiller.setPreviousDice(value[0], value[1]); // Gem v�rdierne af terningslaget hos spiller 1
					if (preSpiller.getWinCondition() == true) { // Foruds�tter spiller2 har over 40 point OG har sl�et 2 ens i forrige runde
						if (rafle.equal() == true) {// Hvis spilleren har sl�et to ens
							// Tjekker om spiller1 har sl�et to ettere og nulstiller hans point i s� fald
							if (value[0] == 1 && value[1] == 1) {
								spiller.setPoint(0);
								spiller.setWinCondition(false);
							}
							else {
								if (spiller.getPoint() >= 40) { // Hvis spilleren har over 40 point
									spiller.setWinCondition(true);
								}

								// T�l point sammen, opdater p� GUI
								spiller.setPoint(rafle.sum() + spiller.getPoint()); // Tilf�jer summen af slaget til spillerens point
							}
							TUI.setBalance(spiller.getName(), spiller.getPoint()); // Opdaterer spillerens point p� GUI'en
						}
						else {
							if (spiller.getWinCondition() == true) {
								spiller.setPoint(rafle.sum() + spiller.getPoint());
								TUI.setBalance(spiller.getName(), spiller.getPoint());
								
								if (spiller.getPoint() > preSpiller.getPoint()) {
									TUI.showMessage("TILLYKKE " + spiller.getName() + ". DU HAR VUNDET SPILLET!");
									endGame = true;
								}
								else {
									TUI.showMessage("TILLYKKE " + preSpiller.getName() + ". DU HAR VUNDET SPILLET!");
									endGame = true;
								}
							}
							else {
								TUI.showMessage("TILLYKKE " + preSpiller.getName() + ". DU HAR VUNDET SPILLET!");
							}
							endGame = true;
						}
					}

					else {// Foruds�tter spiller2 ikke har over 40 point OG har sl�et 2 ens i forrige runde
						// Tjekker om spiller1 har sl�et to ettere og nulstiller hans point i s� fald
						if (value[0] == 1 && value[1] == 1) {
							spiller.setPoint(0); // Nulstil point
							spiller.setWinCondition(false);
							TUI.setBalance(spiller.getName(), spiller.getPoint()); // Opdaterer spillerens point p� GUI'en
						}
						else {
							if (rafle.equal() == true) {// To ens som ikke er to ettere
								if (spiller.getPoint() >= 40) // Markerer at spiller 1 har vundet spillet 
									spiller.setWinCondition(true);

								spiller.setPoint(rafle.sum() + spiller.getPoint()); // Tilf�jer summen af slaget til spillerens point
								TUI.setBalance(spiller.getName(), spiller.getPoint()); // Opdaterer spillerens point p� GUI'en
								spiller = preSpiller;
							}
							else {// Turen skifter til spiller2
								spiller.setPoint(rafle.sum() + spiller.getPoint()); // Tilf�jer summen af slaget til spillerens point
								TUI.setBalance(spiller.getName(), spiller.getPoint()); // Opdaterer spillerens point p� GUI'en
							}

							if (spiller == Main.spiller1) {
								spiller = Main.spiller2;
							}
							else if (spiller == Main.spiller2) {
								spiller = Main.spiller1;
							}
						}
					}
				}
			}
		}
		break;
		default:
			System.out.println("Der skete en fejl.");
			break;
		}
	}
}
